package com.gonsin.project.creator.utils;

import java.util.*;

public class TypeUtils {

    private static Map<String, String> JAVA_TO_SQL;
    static {
        Map<String, String> m = new HashMap<>();
        m.put("String", "varchar(64)");
        m.put("int", "int(8)");
        m.put("Integer", "int(8)");
        m.put("long", "bigint");
        m.put("Long", "bigint");
        m.put("boolean", "tinyint(1)");
        m.put("Boolean", "tinyint(1)");
        m.put("byte", "int(4)");
        m.put("Byte", "int(4)");
        m.put("shot", "int(6)");
        m.put("Shot", "int(6)");
        m.put("float", "decimal(6, 2)");
        m.put("Float", "decimal(6, 2)");
        m.put("double", "decimal(8, 2)");
        m.put("Double", "decimal(8, 2)");
        JAVA_TO_SQL = m;
    }

    private static Map<String, String> JAVA_TO_OBJ;
    static {
        Map<String, String> m = new HashMap<>();
        m.put("int", "Integer");
        m.put("long", "Long");
        m.put("byte", "Byte");
        m.put("short", "Short");
        m.put("boolean", "Boolean");
        m.put("char", "Character");
        m.put("double", "Double");
        m.put("float", "Float");
        JAVA_TO_OBJ = m;
    }


    private static List<String> MYSQL_KEYWORD = new ArrayList<>();
    static {
        String keyworkds = "ADD ALL ALTER  " +
        "ANALYZE AND AS  " +
        "ASC ASENSITIVE BEFORE  " +
        "BETWEEN BIGINT BINARY  " +
        "BLOB BOTH BY  " +
        "CALL CASCADE CASE  " +
        "CHANGE CHAR CHARACTER  " +
        "CHECK COLLATE COLUMN  " +
        "CONDITION CONNECTION CONSTRAINT  " +
        "CONTINUE CONVERT CREATE  " +
        "CROSS CURRENT_DATE CURRENT_TIME  " +
        "CURRENT_TIMESTAMP CURRENT_USER CURSOR  " +
        "DATABASE DATABASES DAY_HOUR  " +
        "DAY_MICROSECOND DAY_MINUTE DAY_SECOND  " +
        "DEC DECIMAL DECLARE  " +
        "DEFAULT DELAYED DELETE  " +
        "DESC DESCRIBE DETERMINISTIC  " +
        "DISTINCT DISTINCTROW DIV  " +
        "DOUBLE DROP DUAL  " +
        "EACH ELSE ELSEIF  " +
        "ENCLOSED ESCAPED EXISTS  " +
        "EXIT EXPLAIN FALSE  " +
        "FETCH FLOAT FLOAT4  " +
        "FLOAT8 FOR FORCE  " +
        "FOREIGN FROM FULLTEXT  " +
        "GOTO GRANT GROUP  " +
        "HAVING HIGH_PRIORITY HOUR_MICROSECOND  " +
        "HOUR_MINUTE HOUR_SECOND IF  " +
        "IGNORE IN INDEX  " +
        "INFILE INNER INOUT  " +
        "INSENSITIVE INSERT INT  " +
        "INT1 INT2 INT3  " +
        "INT4 INT8 INTEGER  " +
        "INTERVAL INTO IS  " +
        "ITERATE JOIN KEY  " +
        "KEYS KILL LABEL  " +
        "LEADING LEAVE LEFT  " +
        "LIKE LIMIT LINEAR  " +
        "LINES LOAD LOCALTIME  " +
        "LOCALTIMESTAMP LOCK LONG  " +
        "LONGBLOB LONGTEXT LOOP  " +
        "LOW_PRIORITY MATCH MEDIUMBLOB  " +
        "MEDIUMINT MEDIUMTEXT MIDDLEINT  " +
        "MINUTE_MICROSECOND MINUTE_SECOND MOD  " +
        "MODIFIES NATURAL NOT  " +
        "NO_WRITE_TO_BINLOG NULL NUMERIC  " +
        "ON OPTIMIZE OPTION  " +
        "OPTIONALLY OR ORDER  " +
        "OUT OUTER OUTFILE  " +
        "PRECISION PRIMARY PROCEDURE  " +
        "PURGE RAID0 RANGE  " +
        "READ READS REAL  " +
        "REFERENCES REGEXP RELEASE  " +
        "RENAME REPEAT REPLACE  " +
        "REQUIRE RESTRICT RETURN  " +
        "REVOKE RIGHT RLIKE  " +
        "SCHEMA SCHEMAS SECOND_MICROSECOND  " +
        "SELECT SENSITIVE SEPARATOR  " +
        "SET SHOW SMALLINT  " +
        "SPATIAL SPECIFIC SQL  " +
        "SQLEXCEPTION SQLSTATE SQLWARNING  " +
        "SQL_BIG_RESULT SQL_CALC_FOUND_ROWS SQL_SMALL_RESULT  " +
        "SSL STARTING STRAIGHT_JOIN  " +
        "TABLE TERMINATED THEN  " +
        "TINYBLOB TINYINT TINYTEXT  " +
        "TO TRAILING TRIGGER  " +
        "TRUE UNDO UNION  " +
        "UNIQUE UNLOCK UNSIGNED  " +
        "UPDATE USAGE USE  " +
        "USING UTC_DATE UTC_TIME  " +
        "UTC_TIMESTAMP VALUES VARBINARY  " +
        "VARCHAR VARCHARACTER VARYING  " +
        "WHEN WHERE WHILE  " +
        "WITH WRITE X509  " +
        "XOR YEAR_MONTH ZEROFILL";
        MYSQL_KEYWORD = Arrays.asList(keyworkds.trim().split(" "));
    }

    /**
     * 获取数据库类型
     */
    public static String getDbType(String javaType){
        return JAVA_TO_SQL.getOrDefault(javaType, "text");
    }


    /**
     * 转为对象类型
     */
    public static String getObjectType(String javaType){
        return JAVA_TO_OBJ.getOrDefault(javaType, javaType);
    }


    /**
     * 转换为数据库非关键词字段
     */
    public static String dbColumn(String name){
        String value = name.toUpperCase();
        if(MYSQL_KEYWORD.contains(value)){
            return "gs_" + name;
        }
        return name;
    }

}
